package cn.edu.bjut.nlp.basic._2object;
/*
static（静态、修饰符）
	
	static修饰成员变量时：static修饰成员变量时,那么该成员变量的数据就是一个共享的数据.
	
		静态成员变量的访问方式：
			
				方式一： 使用对象进行访问。
						对象.属性名
				方式二：可以使用类名进行访问。
						类名.属性名
		注意：
			1. 非静态成员变量不能类名直接访问，只能使用对象进行访问。
			2. 千万不要为了方便访问成员变量而使用static修饰，一定要是该数据是共享数据 时才使用static修饰。

	static修饰方法（静态的成员方法）:
		
		访问方式：
			
			方式一：可以使用对象进行访问。
					对象.静态的函数名();

			方式二：可以使用类名进行访问。
					类名.静态函数名字。
		
		推荐使用是类名直接访问静态的成员。

静态的成员变量与非静态的成员变量的区别：
	1. 作用上的区别：
		1. 静态的成员变量的作用共享一个 数据给所有的对象使用。
		2. 非 静态的成员变量的作用是描述一类事物的公共属性。
	2. 数量与存储位置上的区别：
		1. 静态成员变量是存储方法 区内存中，而且只会存在一份数据。
		2. 非静态的成员变量是存储在堆内存中，有n个对象就有n份数据。
	3. 生命周期的区别：
		1. 静态的成员变量数据是随着类的加载而存在，随着类文件的消失而消失。
		2.非静态的成员数据是随着对象的创建而存在，随着 对象被垃圾回收器回收而消失。

静态函数要注意的事项：
	1. 静态函数是可以调用类名或者对象进行调用的，而非静态函数只能使用对象进行调用。
	2. 静态的函数可以直接访问静态的成员，但是不能直接访问非静态的成员。	
		原因：静态函数是可以使用类名直接调用的，这时候可能还没有存在对象，
		而非静态的 成员数据是随着对象 的存在而存在的。

	3. 非静态的函数是可以直接访问静态与非静态的成员。
		原因：非静态函数只能由对象调用，当对象存在的时候，静态数据老早就已经存在了，而非静态
		数据也随着对象的创建而存在了。

	4. 静态函数不能出现this或者super关键字。
		原因：因为静态的函数是可以使用类名调用的，一旦使用类名调用这时候不存在对象，而this
		关键字是代表了一个函数 的调用者对象，这时候产生了冲突。

静态的数据的生命周期：静态的成员变量数据是优先于对象存在的。

static什么时候修饰一个函数？
	
	如果一个函数没有直接访问到非静态的成员时，那么就可以使用static修饰了。 一般用于工具类型的方法
	

静态函数不能访问非静态的成员？
	 静态函数只要存在有对象，那么也可以访问非 静态的数据。只是不能直接访问而已。	
*/
public class _0810_Object_StaticFunction {
	public static void main(String[] args){
		Stu.sleep();
	}
}
class Stu{
	String name;
	static String country="CN";
	//静态代码块 ：静态代码块是在Stu.class文件加载到内存的时候就马上执行的。
	static{
			System.out.println("静态代码块执行了...");
	}
	public Stu(String name){
		
		this.name = name;
	}
	
	public void study(){
		System.out.println("study function");
		//可以访问直接静态数据成员，可以直接访问非静态数据成员
		System.out.println(country +name);
	}
	//静态方法与非静态方法的字节码文件是同时存在内存中 的。 只是静态的成员变量数据是优先于对象存在而已。
	public static void sleep(){
		//可以访问静态数据成员
		System.out.println(country );
		//不能出行this super
		//System.out.println(this.name);
		//不可以直接访问非静态数据成员
		//System.out.println(name);
	}
}